#ifndef UnstructMG_MG_TYPES_HPP
#define UnstructMG_MG_TYPES_HPP

#include "par_CSRMatrix.hpp"


typedef enum {  PJ, PGS, BILU, GLBLU } RELAX_TYPE;
typedef enum {  } RSTR_PRLG_TYPE;
typedef enum {  PLAIN, SMOOTHED } GAL_TYPE;// Galerkin的类型

extern std::unordered_set<int > iso_wells;
extern std::set<int> coar_wells;

/// @brief 用于管理在多重网格中不同层间发生进程数收缩时的数据结构
class SHADOW
{
public:
    // 所有的主进程组成的通信子
    MPI_Comm masterComm = MPI_COMM_NULL;
    // 一个主进程和对应若干从属进程组成的通信子
    MPI_Comm subComm = MPI_COMM_NULL;
    // 主进程所需的数据
    // 接收数目，等同于本主进程对应多少个从属进程
    int num_recvs = 0;
    // 从属进程的进程号，注意这个进程号是原来的整个通信域的
    int* recv_pids = nullptr;
    // 从从属进程收集回来的消息应该放置的位置偏移
    int* recv_offsets = nullptr;

    // 从属进程所需的数据
    // 向谁发？即主进程的进程号，注意这个进程号是原来的整个通信域的
    int send_pid = MPI_PROC_NULL;
    // 要向主进程发送的消息长度
    int send_len = 0;

    /// @brief 析构函数
    ~SHADOW() {
        delete [] recv_pids;
        delete [] recv_offsets;
        if (subComm    != MPI_COMM_NULL) MPI_Comm_free(& subComm);
        if (masterComm != MPI_COMM_NULL) MPI_Comm_free(& masterComm);
    }
};

struct CoarseConfig
{
    int iter = 4;
    double theta = 0.25;
    double smoothed_weight = 0.0;
};


#endif